/**
 * @author
 * Júlio Zynger
 * DRE: 110092466
 */
package controller;

import java.util.TreeMap;

import model.AFD;
import model.Estado;
import model.Linguagem;


public class Brzozowski {
	private AFD afd;
	private TreeMap<Integer, Linguagem> lings;
	private int numEstados;

	public Brzozowski(AFD afd) {
		this.afd = afd;
		lings = new TreeMap<Integer, Linguagem>();	
		montaTreeMapLinguagens();
		this.numEstados = this.afd.getEstados().size();
	}
	
	public void montaTreeMapLinguagens(){
		int i = 1;
		for (Estado e: this.afd.getEstados()) {
			if (e.equals(this.afd.getInicial())) {
				lings.put(1, new Linguagem(e.getLinguagem(), e.getNome()));
			}else{
				lings.put(++i, new Linguagem(e.getLinguagem(), e.getNome()));
			}
		}
		//this.numEstados = i; //TODO
	}
	
	public String brzozowski() {
		for (Estado e : this.afd.getEstados()) {
			System.out.println(e.getNome()+" - "+e.getLinguagem());
		}
		System.out.println();
		
		
		System.out.println("I = 3 Ling: "+ (new Linguagem((lings.get(3).simplifica(lings.get(3).getLinguagem())), lings.get(3).getEstado()).arden()));
		for (int i = this.numEstados; i > 0; i--) {
			if(!(i == this.numEstados)){ //no primeiro estado nao preciso testar a substituicao
				for (int j = this.numEstados; j > i; j--) { //para cada linha tenho que testar se preciso substituir a linguagem de cada estado
					lings.get(i).setLinguagem(lings.get(i).troca(lings.get(j).getEstado(), lings.get(j).getLinguagem())); //ERRO ESTA AQUI NA SUBSTITUICAO TODO
					System.out.println("I = " + i + " Substitui: " + lings.get(i).getLinguagem());
				}
			}
			if (!lings.get(i).isSimples()) {
				System.out.println("antes:" + lings.get(i).getLinguagem());
				lings.get(i).setLinguagem(lings.get(i).simplifica(lings.get(i).getLinguagem()));
				System.out.println("simplificada: "+lings.get(i).getLinguagem());
				//TODO fazer distributiva? //acho que nao precisa
				/*System.out.println("Distributiva:"+lings.get(i).distribute(lings.get(i).getLinguagem()));
				lings.get(i).setLinguagem(lings.get(i).distribute(lings.get(i).getLinguagem()));*/
				String s = lings.get(i).arden();
				if(s.charAt(0) == '(' && s.charAt(s.length()-1) == ')') s = s.substring(1, s.length()-1);
				lings.get(i).setLinguagem(s);
			}
		}
		
		/*for (int i = numEstados; i > 0; i--) {
			if (i == numEstados) { //se i==qtd quer dizer que estou na primeira iteracao (primeiro estado, logo nao faco substituicao
				if (!lings.get(i).verifica()) {
					System.out.println("I = " + i + " Antes: " + lings.get(i).getLinguagem());
					lings.get(i).setLinguagem(lings.get(i).simplifica(lings.get(i).getLinguagem()));
					System.out.println("I = " + i + " Simplificado: " + lings.get(i).getLinguagem());
					lings.get(i).arden();
					System.out.println("I = " + i + " Arden: " + lings.get(i).getLinguagem());
				}
			}else{
				for (int j = numEstados; j > i; j--) { //para cada linha tenho que testar se preciso substituir a linguagem de cada estado
					System.out.println("I = " + i + " Antes: " + lings.get(i).getLinguagem());
					lings.get(i).substitui(lings.get(j).getEstado(),lings.get(j).getLinguagem()); //o erro esta na substituicao
					System.out.println("I = " + i + " Substitui: " + lings.get(i).getLinguagem());
				}
				if (!lings.get(i).verifica()) { //provavelmente verifica() é pra saber se preciso de simplificar ou fazer arden
					lings.get(i).setLinguagem(lings.get(i).simplifica(lings.get(i).getLinguagem()));
					System.out.println("I = " + i + " Simplificado: " + lings.get(i).getLinguagem());
					lings.get(i).arden();
					System.out.println("I = " + i + " Arden: " + lings.get(i).getLinguagem());
				}
			}
		}*/
		
		return lings.get(1).getLinguagem();
	}
}